package 滑动窗口;
import java.util.*;
// 创建start和end两个指针，end下标不断向右移动。
// 判断当前遍历到的新的 s[end]是否在之前已出现过（即是否重复出现）。
// 若出现过，则将 start下标指向之前出现位置的下一个位置，并更新当前不重复子串长度 
// len只记录最大长度，不记录当前长度

public class lengthOfLongestSubstring {
    public static int lengthOfLongestSubstringM(String s){
        // 初始化左指针
        int start = 0;
        // 初始化最长子串的长度
        int len = 0;
        // 使用HashSet来存储窗口中的字符
        HashSet<Character> set = new HashSet<>();
        // 遍历字符串
        for(int end = 0; end < s.length(); end++){
            // 获取当前字符
            char c = s.charAt(end);
            // 如果当前字符在窗口中存在，则移动左指针
            while(start < end && set.contains(c)){
                // 移除窗口左边的字符
                set.remove(s.charAt(start));
                // 移动左指针
                start++;
            }
            // 将当前字符加入窗口
            set.add(c);
            // 更新最长子串的长度
            len = Math.max(len, end - start + 1);
        }
        // 返回最长子串的长度
        return len;
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        System.out.println(lengthOfLongestSubstringM(s));
        sc.close();
    }
}
